package plp.orientadaObjetos2.comando;

import plp.expressions2.memory.VariavelJaDeclaradaException;
import plp.expressions2.memory.VariavelNaoDeclaradaException;
import plp.orientadaObjetos1.excecao.declaracao.ClasseJaDeclaradaException;
import plp.orientadaObjetos1.excecao.declaracao.ClasseNaoDeclaradaException;
import plp.orientadaObjetos1.excecao.declaracao.ObjetoJaDeclaradoException;
import plp.orientadaObjetos1.excecao.declaracao.ObjetoNaoDeclaradoException;
import plp.orientadaObjetos1.excecao.declaracao.ProcedimentoJaDeclaradoException;
import plp.orientadaObjetos1.excecao.declaracao.ProcedimentoNaoDeclaradoException;
import plp.orientadaObjetos1.excecao.execucao.EntradaInvalidaException;
import plp.orientadaObjetos1.expressao.Expressao;
import plp.orientadaObjetos1.expressao.ListaExpressao;
import plp.orientadaObjetos1.expressao.leftExpression.Id;
import plp.orientadaObjetos1.memoria.Objeto;

public class InvocaHandler extends AbstractComandoHandler {

	@Override
	public boolean aceita(Expressao comando) {
		boolean retorno = false;
		if (comando.toString().equals("invoca"))
			retorno = true;
		
		return retorno;
	}

	@Override
	public void manipula(ComandoBean comandoBean)
			throws ClasseNaoDeclaradaException, VariavelNaoDeclaradaException,
			VariavelJaDeclaradaException, ObjetoNaoDeclaradoException,
			ClasseJaDeclaradaException, ObjetoJaDeclaradoException,
			ProcedimentoNaoDeclaradoException,
			ProcedimentoJaDeclaradoException, EntradaInvalidaException {
		
		Objeto objetoMetodo =  comandoBean.getAmbiente().getObjeto(comandoBean.getVr());
		Id nomeDoMetodoASerInvocado = new Id(objetoMetodo.getEstado().get(new Id("nome_metodo")).toString());
		new ChamadaMetodoOO2(comandoBean.getParametrosReais().getHead(), nomeDoMetodoASerInvocado, new ListaExpressao()).executar(comandoBean.getAmbiente());
		
	}
	
}
